#! /usr/bin/env python

# Alunos:   Eliezer de Souza da Silva  RA: 124065
#           Fernanda Brandao Silva     RA: 060727
#           Michel Silva Fornaciali    RA: 071884
# IA368R: Eduardo Valle - Trabalho 4, Programa 3 - Processamento da consulta
#
# recebe como parametro um nome de um arquivo com uma base de descritores locais
# um numero n 
#
import sys
import time
from operator import itemgetter
import numpy as np
from pympler import asizeof
from scipy.spatial.distance import cdist
from scipy.spatial import cKDTree


def strline2array(line,inicio,fim):
    # Dado uma linha do descritor da imagem, extrai o vetor de caracteristica e converte em array  
    # o parametro inicio e fim significa que os elementos entre um e outro serao convertidos para array.
    return np.array(line.split(" ")[inicio:fim], 'int')   # PARAMETRIZAR ESTES INDICES!
    

    # --------- PROGRAMA PRINCIPAL ---------
    
#print ">>> Inicio da leitura da imagem de consulta..."        
    
# Armazena os parametros de entrada
baseFile = sys.argv[1]          # arquivo da base
nImages = int(sys.argv[2])      # numero de imagens

# Leitura dos vetores de caracteristica da imagem de consulta
'''
consulta = []
for vector in sys.stdin:
    consulta.append(strline2array(vector,4,132))
'''
consulta = np.genfromtxt(sys.stdin)[:,4:]
    
#print "  > Fim da leitura da imagem de consulta!" 
#print "  > Imagem com "+str(consulta.shape[0])+" descritores!" 
#print ">>> Inicio do processamento da base..."  

    
# Leitura do arquivo da base


# Processa a base armazenando os dados no formato "imagem, vetorCaracteristica" e tambem criando um indice de votos
base = []#np.zeros((1,128))
invindex = []
votos = dict() 
t1 = time.time()
f = open(baseFile)
for line in f:        
    aux = line.split()
    base.append(strline2array(line,5,133))  
    votos[aux[0]]=0.0 #hashtable indexada pelo nome do arquivo
    invindex.append(aux[0]) #indice inverso que faz o mapeamento do indice na base para um nome na hashtable
f.close()    

MBase = np.asarray(base) #np.genfromtxt(baseFile)[:,5:]
tBase = MBase.shape[0]
total = consulta.shape[0]

t2 = time.time()
kt = cKDTree(MBase,100)
t3 = time.time()
m1 = asizeof.asizeof(kt)
m2 = asizeof.asizeof(MBase)
m3 = asizeof.asizeof(base)
m4 = asizeof.asizeof(votos)
#print "  > Fim do processamento da base!"
print "Tempo Base: ", t2-t1
print "Tempo Indexacao: ", t3-t2
print "Memoria BaseArray: ", m2
print "Memoria Index: ", m1
print "Memoria Base: ", m3
print "Memoria votos: ",m4
  
#print "\n>>> Base com ", tBase, " descritores  "
#print ">>> Inicio da contagem de votos: serao feitas  ", total, " consultas..." 

#Mconsultas = asarray(consulta)
t1 = time.time()
dists, indices = kt.query(consulta, 1, 3)
t2 = time.time()

for i in range(indices.shape[0]):
    votos[invindex[indices[i]]] += 1
    
#print "  > Fim da contagem dos votos!"
print "Tempo Busca: ", t2-t1

#print "\n>>> Impressao dos resultados..."
  

# Ordena as imagens pelo numero de votos 
votos = sorted(votos.iteritems(), key=itemgetter(1), reverse=True)   

# Lista as N imagens mais votadas
k=0
for voto in votos:
    sys.stdout.write(str(voto[0]) + " " + str(voto[1]) + "\n")
    k+=1
    if(k>=nImages):
        break



